package com.tms.basic.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tms.basic.pojo.domain.Vehicle;
import com.tms.basic.pojo.req.VehicleQueryReq;
import com.tms.basic.pojo.vo.VehicleVO;
import com.tms.common.core.domain.R;

import java.util.List;
import java.util.Map;

/**
 * 车辆信息服务接口
 *
 * @author TMS
 * @since 2024-01-01
 */
public interface VehicleService extends IService<Vehicle> {

    /**
     * 分页查询车辆信息
     *
     * @param req 查询条件
     * @return 车辆信息分页结果
     */
    R<IPage<VehicleVO>> getVehiclePage(VehicleQueryReq req);

    /**
     * 根据条件查询车辆信息列表
     *
     * @param req 查询条件
     * @return 车辆信息列表
     */
    R<List<VehicleVO>> getVehicleList(VehicleQueryReq req);

    /**
     * 根据ID查询车辆详细信息
     *
     * @param id 车辆ID
     * @return 车辆详细信息
     */
    R<VehicleVO> getVehicleById(Long id);

    /**
     * 根据车牌号查询车辆信息
     *
     * @param licensePlate 车牌号
     * @return 车辆信息
     */
    R<VehicleVO> getVehicleByLicensePlate(String licensePlate);

    /**
     * 新增车辆信息
     *
     * @param vehicle 车辆信息
     * @return 新增结果
     */
    R<Boolean> addVehicle(Vehicle vehicle);

    /**
     * 修改车辆信息
     *
     * @param vehicle 车辆信息
     * @return 修改结果
     */
    R<Boolean> updateVehicle(Vehicle vehicle);

    /**
     * 删除车辆信息
     *
     * @param id 车辆ID
     * @return 删除结果
     */
    R<Boolean> deleteVehicle(Long id);

    /**
     * 批量删除车辆信息
     *
     * @param ids 车辆ID列表
     * @return 删除结果
     */
    R<Boolean> deleteVehicleBatch(List<Long> ids);

    /**
     * 更新车辆状态
     *
     * @param id     车辆ID
     * @param status 新状态
     * @return 更新结果
     */
    R<Boolean> updateVehicleStatus(Long id, Integer status);

    /**
     * 查询即将到期的车辆（保险或年检30天内到期）
     *
     * @param days 提前天数，默认30天
     * @return 即将到期的车辆列表
     */
    R<List<VehicleVO>> getExpiringVehicles(Integer days);

    /**
     * 根据状态统计车辆数量
     *
     * @param organizationId 机构ID
     * @return 车辆状态统计结果
     */
    R<List<Map<String, Object>>> countVehicleByStatus(Long organizationId);

    /**
     * 检查车牌号是否已存在
     *
     * @param licensePlate 车牌号
     * @param excludeId    排除的车辆ID（用于修改时排除自己）
     * @return 是否存在
     */
    boolean isLicensePlateExists(String licensePlate, Long excludeId);
} 